package AnalizadorSintactico;

import java.util.ArrayList;

import javax.swing.tree.DefaultMutableTreeNode;

import com.sun.xml.internal.bind.v2.runtime.RuntimeUtil.ToStringAdapter;

import AnalizadorLexico.Lexema;
import AnalizadorSemantico.SimboloCampo;
import AnalizadorSemantico.SimboloMetodo;
import AnalizadorSemantico.UtilidadesSemanticas;

public class ExpresionAritmetica {
	private TerminoProducto termino;
	private ExpresionAritmetica expresion;
	private Lexema operador;
	private String ambito;
	private ArrayList<SimboloCampo> tablaCampos;
	private ArrayList<SimboloMetodo> tablaMetodos;

	public void setTablaCampos(ArrayList<SimboloCampo> tablaCampos) {
		this.tablaCampos = tablaCampos;
	}

	public void setAmbito(String ambito) {
		this.ambito = ambito;
	}

	public ExpresionAritmetica(TerminoProducto termino, Lexema operador,
			ExpresionAritmetica expresion) {
		this.termino = termino;
		this.expresion = expresion;
		this.operador = operador;
	}

	public String evaluarTipoResultante() {
		String tipoResultante = "";
		if (termino != null && expresion != null) {
			expresion.setAmbito(ambito);
			expresion.setTablaCampos(tablaCampos);
			expresion.setTablaMetodos(tablaMetodos);
			termino.setAmbito(ambito);
			termino.setTablaCampos(tablaCampos);
			termino.setTablaMetodos(tablaMetodos);
			String tipoExpresion = expresion.evaluarTipoResultante();
			String tipoTermino = termino.evaluarTipoResultante();
			tipoResultante = UtilidadesSemanticas.mayorTipoResultante(
					tipoTermino, tipoExpresion);
			return tipoResultante;
		}
		if (termino != null) {
			termino.setAmbito(ambito);
			termino.setTablaCampos(tablaCampos);
			termino.setTablaMetodos(tablaMetodos);
			tipoResultante = termino.evaluarTipoResultante();
			return tipoResultante;
		}

		return tipoResultante;
	}

	@Override
	public String toString() {
		String expA = "";

		if (termino != null) {
			expA += termino.toString();
		}
		if (operador != null) {
			expA += operador.getLexema();
		}
		if (expresion != null) {
			expA += expresion.toString();
		}
		return expA;
	}

	public DefaultMutableTreeNode getSubArbol() {
		DefaultMutableTreeNode nodo = new DefaultMutableTreeNode("expArit: "
				+ evaluarTipoResultante());
		if (termino != null) {
			DefaultMutableTreeNode termNod = termino.getSubArbol();
			nodo.add(termNod);
		}
		if (operador != null) {
			DefaultMutableTreeNode opNod = new DefaultMutableTreeNode(
					"op Aditivo");
			nodo.add(opNod);
		}
		if (expresion != null) {
			DefaultMutableTreeNode expNod = expresion.getSubArbol();
			nodo.add(expNod);
		}
		return nodo;
	}

		public void setTablaMetodos(ArrayList<SimboloMetodo> tablaMetodos) {
		this.tablaMetodos = tablaMetodos;

	}

}
